package juego.enemigos;

import org.w3c.dom.Node;

import niveles.Escenario;
import avanzadas.BuscadorDeCamino;
import basicas.Posicion;
import juego.IDestruible;
import juego.IMovil;
import juego.ObjetoDelJuego;
import juego.Tanque;
import juego.enums.tipoMovimiento;

public abstract class TanqueEnemigo extends Tanque implements IDestruible, IMovil { 
	private BuscadorDeCamino buscador;
	
	public TanqueEnemigo(Posicion posicionInicial) {						
		super(posicionInicial);
	};
	
	public TanqueEnemigo(Node n) {
		super(n);
	}

	public void setNivel(Escenario nivel) {
		super.setNivel(nivel);
		if (buscador == null) {
			buscador = new BuscadorDeCamino(this, nivel.getTablero());
		}
	}
	
	public abstract ObjetoDelJuego getObjetivo();
	
	public void vivir() {
		super.vivir();
		tipoMovimiento tm = null;
		if (this.getMovimientosRestantes() <= 0) {
			this.centrar();			
			if (lineaDeFuego() == null) {
				if (getObjetivo() != null) {
					tm = buscador.buscarCamino(getObjetivo().getPosicion());
				}
				if (tm != null) {								
					if (puedoMover(tm)) {					
						mover(tm);
					}
				}			
			} else {
				setDireccion(lineaDeFuego());
				disparar();
			}
		} else {
			this.avanzar();				
		}
		
	}
	
	private tipoMovimiento lineaDeFuego() {
		ObjetoDelJuego objetivo = getObjetivo();
		if (objetivo != null) {
			if ((objetivo.getPosicion().getX() == getPosicion().getX()) || (objetivo.getPosicion().getY() == getPosicion().getY())) {
				if (objetivo.getPosicion().getX() == getPosicion().getX()) {
					if (objetivo.getPosicion().getY() >= getPosicion().getY()) return tipoMovimiento.abajo; else return tipoMovimiento.arriba;
				} else {
					if (objetivo.getPosicion().getX() >= getPosicion().getX()) return tipoMovimiento.derecha; else return tipoMovimiento.izquierda;
				}
			}
		}
		return null;
	}
	
	public void setBuscador(BuscadorDeCamino buscador) {
		this.buscador = buscador;
	}
	
	public int explotar() {		
		if (getArma().getCantidadDisparos() >= 1) {
			ArmaBonus a = getArma().armaBonus(getPosicion());
			if (a != null) getNivel().agregarObjetoVivo(a);
		}
		super.explotar();
		return getPuntos();
	}	
	
}

